﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ATEC.GeometryNET;
using ATEC.ATDataCoreNET;
using ATEC.ATDataCoreNET.ATObjects;
using SSDPNET;
using SSDPNET.DataCore;
using System.Windows.Forms;
namespace TextTableExample
{
    /// <summary>
    /// 类名：CreateTable
    /// 分类：玄镜BIM图形平台/C#开发/示例代码/表格对象
    /// 功能：展示如何创建和操作表格对象，包括创建表格、插入行列、合并单元格、修改边框等功能。
    /// 关键类及说明：
    ///     - ATTextTableObject：表格对象类，用于在场景中表示表格实体
    ///     - TextTable：表格数据类，管理表格的结构和内容
    ///     - ATTextStyle：文字样式类，定义表格文字的显示属性
    ///     - TableCellMarginValues：单元格边距类，控制单元格内容的边距
    /// </summary>
    public class CreateTable
    {
        /// <summary>
        /// 表格行高，单位为UOR（用户单位）
        /// </summary>
        static double rowHight = 10000.0;

        /// <summary>
        /// 表格列宽，单位为UOR（用户单位）
        /// </summary>
        static double colWidth = 14000.0;

        /// <summary>
        /// 表格使用的文字样式
        /// </summary>
        static ATTextStyle textStyle = null;

        /// <summary>
        /// 当前操作的表格对象实例
        /// </summary>
        public static ATTextTableObject tableObject = null;

        /// <summary>
        /// 方法名：CreateTextTable
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/表格对象/创建
        /// 功能：创建一个5行4列的表格，设置其基本属性并添加到场景中。
        /// 参数：无
        /// 返回值：无
        /// 关键类及说明：
        ///     - TextTable：表格数据类，用于创建和配置表格
        ///     - TableCellMarginValues：单元格边距设置
        /// </summary>
        public static void CreateTextTable()
        {
            ATSceneRef sceneref = ScenesFunctions.SceneRefGetActive();//获得当前激活的模型空间
            ATProject project = sceneref.GetATProject();// 获得当前激活的文件

            //创建文本样式，并持有
            textStyle = CreateTextStyle("表格内容");

            //创建一个5行4列得表格
            uint rowCount = 5;
            uint columnCount = 4;
            double backupTextHeight =50;
            //创建表格
            TextTable textTable = TextTable.Create(rowCount, columnCount, textStyle.Id, backupTextHeight, sceneref.GetATScene());
            //设定边距
            double uorMM = ScenesFunctions.SceneRefGetUorPerMeter(sceneref) / 1000;
            TableCellMarginValues marginValue = new TableCellMarginValues(0.6 * uorMM, 0.6 * uorMM, 1.2 * uorMM, 1.2 * uorMM);
            textTable.DefaultMargins = marginValue;

            //设定表格行高、列宽
            textTable.DefaultRowHeight = rowHight;
            textTable.DefaultColumnWidth = colWidth;
            textTable.Origin = new XPoint3d(0, 0, 0);
            //将textTable转换为tableObject 添加到Scene中
            tableObject = new ATTextTableObject(textTable);
            tableObject.AddToScene();
        }

        /// <summary>
        /// 方法名：ModifyEdge
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/表格对象/边框
        /// 功能：修改表格的边框属性，包括颜色和样式。
        /// 参数：无
        /// 返回值：无
        /// 关键类及说明：
        ///     - TableSymbologyValues：表格符号值类，控制边框的显示特性
        ///     - TableCellListEdges：边框类型枚举，指定要修改的边框位置
        /// </summary>
        public static void ModifyEdge()
        {
            TextTable textTable = tableObject.ExtractTextTable();

            //获取TableSymbologyValues，用于查询或修改表格边框线或填充的颜色、样式和线宽
            IList<TableCellIndex> cells = new List<TableCellIndex>();
            cells.Add(new TableCellIndex(0, 0));
            IEnumerable<TableSymbologyValues> symbolArr = textTable.GetEdgeSymbology(TableCellListEdges.All, cells);
            //设置边框颜色
            TableSymbologyValues pFstSymbol = symbolArr.First();
            pFstSymbol.LineColor = 3;
            List<TableCellIndex> cellIdxArr = new List<TableCellIndex>();
            IEnumerable<TextTableCell> cellArr = textTable.Cells;
            //拿到所有cellindex
            foreach (TextTableCell cell in cellArr)
            {
                cellIdxArr.Add(cell.Index);
            }
            //设置边框  TableCellListEdges控制上、下、左、右
            textTable.SetEdgeSymbology(pFstSymbol, TableCellListEdges.Exterior, cellIdxArr);

            ATTextTableObject newTableObj = new ATTextTableObject(textTable);

            newTableObj.ReplaceInScene(tableObject);
        }

        /// <summary>
        /// 方法名：CreateTextStyle
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/表格对象/样式
        /// 功能：创建或获取指定名称的文字样式，设置其基本属性。
        /// 参数：
        ///     - nm：string，文字样式的名称
        /// 返回值：ATTextStyle，创建或获取的文字样式对象
        /// 说明：
        ///     如果指定名称的样式已存在则直接返回；
        ///     否则创建新样式并设置宽度、高度、颜色等属性。
        /// </summary>
        public static ATTextStyle CreateTextStyle(string nm)
        {
            ATProject activeProj = ATEC.ATCore.Session.Entity.GetActiveATProject();

            // 查找是否已存在
            ATTextStyle txtStyle = ATTextStyle.GetByName(nm, activeProj);
            if (txtStyle != null)
            {
                return txtStyle;
            }


            // 新建
            txtStyle = new ATTextStyle(nm, activeProj);
            {
                // 属性 // 宽、高、颜色
                txtStyle.SetProperty(TextStyleProperty.Width, (double)500); // 单位 uor
                txtStyle.SetProperty(TextStyleProperty.Height, (double)500);
                txtStyle.SetProperty(TextStyleProperty.ColorFlag, true);
                txtStyle.SetProperty(TextStyleProperty.Color, (UInt32)3);
            }
            txtStyle.Add(activeProj);

            return txtStyle;
        }

        /// <summary>
        /// 方法名：AdjustHeightAndWidth
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/表格对象/调整
        /// 功能：调整表格的行高和列宽到预设值。
        /// 参数：
        ///     - t：TextTable，要调整的表格对象
        /// 返回值：无
        /// </summary>
        private static void AdjustHeightAndWidth(TextTable t)
        {
            for (uint i = 0; i < t.RowCount; i++)
            {
                TextTableRow tableRow = t.GetRow(i);
                tableRow.Height = rowHight;
               
            }
            for (uint i = 0; i < t.ColumnCount; i++)
            {
                TextTableColumn tableCol = t.GetColumn(i);
                tableCol.Width = colWidth;             
            }
        }

        /// <summary>
        /// 方法名：FillContent
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/表格对象/内容
        /// 功能：填充表格内容，为每个单元格设置文本和对齐方式。
        /// 参数：无
        /// 返回值：无
        /// 说明：
        ///     为每个单元格创建文本块，内容为"行号-列号"格式；
        ///     设置单元格文本居中对齐。
        /// </summary>
        public static void FillContent()
        {
            //获取TextTable
            TextTable textTable = tableObject.ExtractTextTable();

            // 填充
            for (int i = 0; i < textTable.RowCount; i++)
            {
                for (int j = 0; j < textTable.ColumnCount; j++)
                {
                    TextTableCell cell_1 = textTable.GetCell(new TableCellIndex((uint)i, (uint)j));
                    if (cell_1 != null)
                    {
                        // 定义要填充的文字
                        TextBlock textBlock = new TextBlock(textStyle, ATEC.ATCore.Session.Entity.GetActiveATScenes());
                        textBlock.AppendText(i.ToString() + "-" + j.ToString()); 

                        cell_1.Alignment = TableCellAlignment.CenterMiddle; //设置单元格对齐方式
                        cell_1.TextBlock = textBlock;   //设置文字                                          
                    }
                }
            }
           
            ATTextTableObject newTableObj = new ATTextTableObject(textTable);
            newTableObj.ReplaceInScene( tableObject);
        }

        /// <summary>
        /// 方法名：MergeRow
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/表格对象/合并
        /// 功能：合并表格中指定位置的行单元格。
        /// 参数：无
        /// 返回值：无
        /// 说明：
        ///     从(2,2)位置开始合并2行1列的单元格；
        ///     合并后自动调整行高。
        /// </summary>
        public static void MergeRow()
        {
            TextTable textTable = tableObject.ExtractTextTable();
            //定义合并的起始单元格索引
            TableCellIndex cellIdx = new TableCellIndex(2, 2);
           //合并该单元格处两行两列
            textTable.MergeCells(cellIdx, numRows:2, numCols:1);
            for (uint i = 0; i < textTable.RowCount; i++)
            {
                TextTableRow tableRow = textTable.GetRow(i);
                tableRow.Height = rowHight;
            }

            ATTextTableObject newTableObj = new ATTextTableObject(textTable);

            newTableObj.ReplaceInScene(tableObject);
        }

        /// <summary>
        /// 方法名：MergeCol
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/表格对象/合并
        /// 功能：合并表格中指定位置的列单元格。
        /// 参数：无
        /// 返回值：无
        /// 说明：
        ///     从(2,0)位置开始合并1行2列的单元格；
        ///     合并后自动调整列宽。
        /// </summary>
        public static void MergeCol()
        {
            TextTable textTable = tableObject.ExtractTextTable();
            //定义合并的起始单元格索引
            TableCellIndex cellIdx = new TableCellIndex(2, 0);
            //合并该单元格处两行一列
            textTable.MergeCells(cellIdx, numRows:1, numCols:2);
            for (uint i = 0; i < textTable.ColumnCount; i++)
            {
                TextTableColumn tableCol = textTable.GetColumn(i);
                tableCol.Width = colWidth;
            }

            ATTextTableObject newTableObj = new ATTextTableObject(textTable);
            newTableObj.ReplaceInScene(tableObject);
        }

        /// <summary>
        /// 方法名：InsertRow
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/表格对象/插入
        /// 功能：在表格的指定位置插入新行。
        /// 参数：无
        /// 返回值：无
        /// 说明：
        ///     通过对话框选择在第2行之前或之后插入新行；
        ///     使用TableInsertDirection枚举控制插入位置。
        /// </summary>
        public static void InsertRow()
        {
            TextTable textTable = tableObject.ExtractTextTable();
            if (DialogResult.Yes == MessageBox.Show("是否在该行前插入行,点否 行后插入行", "提示", MessageBoxButtons.YesNo))
            {
                //在第二行前面插入行
                textTable.InsertRow(2, TableInsertDirection.Before);
            }
            else
            {   //在第二行后面插入行
                textTable.InsertRow(2, TableInsertDirection.After);
            }
            ATTextTableObject newTableObj = new ATTextTableObject(textTable);

            newTableObj.ReplaceInScene(tableObject);
        }

        /// <summary>
        /// 方法名：InsertCol
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/表格对象/插入
        /// 功能：在表格的指定位置插入新列。
        /// 参数：无
        /// 返回值：无
        /// 说明：
        ///     通过对话框选择在第2列之前或之后插入新列；
        ///     使用TableInsertDirection枚举控制插入位置。
        /// </summary>
        public static void InsertCol()
        {
            TextTable textTable = tableObject.ExtractTextTable();
            if (DialogResult.Yes == MessageBox.Show("是否在该列前插入列，点否 在列后插入列", "提示",MessageBoxButtons.YesNo))
            {
                //在第二列前面插入列
                textTable.InsertColumn(2, TableInsertDirection.Before);
            }
            else
            {
                //在第二列后面插入列
                textTable.InsertColumn(2, TableInsertDirection.After);
            }
            ATTextTableObject newTableObj = new ATTextTableObject(textTable);

            newTableObj.ReplaceInScene(tableObject);
        }
    }

}
